/**
 * Projekt do předmetu GJA - LATEX TABLE CREATOR
 *
 * Soubor: ColumnHeaderTableUI.java
 *
 * @author Ondřej Kubal  <xkluba00@stud.fit.vutbr.cz>
 * @author Petr Šimon    <xsimon10@stud.fit.vutbr.cz>
 */

package table;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

import javax.swing.plaf.basic.*;

/**
 *  Column Header UI.
 *  Jedná se o přepsaný <code>BasicTableHeaderUI</code>, doplněný o výběr sloupců
 *  Přidáno nastavování šířky sloupců pomocí dialogu.
 */
public class ColumnHeaderTableUI extends BasicTableHeaderUI
{

     /** první vybraný sloupec */
     int selectedCol = -1;
     
     //** obsluha myši */
     public class MouseInputHandlerNew extends MouseInputHandler
     {
     
          /**
           * kliknutí myši
           * volá overidovanou funkci rodiče a zároveň ošetřuje výběr buňky
           * @param e událost myši
           */
          @Override public void mouseClicked(MouseEvent e)
          {
               super.mouseClicked(e);
               
               if (e.getClickCount() % 2 == 1 && //1x click
                         SwingUtilities.isLeftMouseButton(e))   //levé talčítko
               {
               
                    JTable table = header.getTable();
                    
                    table.selectAll();
                    table.setColumnSelectionInterval(header.columnAtPoint(e.getPoint()), header.columnAtPoint(e.getPoint()));
                    header.repaint();
               }
               else if (SwingUtilities.isLeftMouseButton(e))   //levé talčítko //2x click
               {
                    SizeDialog sizeDialog = new SizeDialog(null, true);
                    sizeDialog.setModeWidths(true);
                    sizeDialog.setTable((MultiSpanCellTable) header.getTable());
                    sizeDialog.setIndex(header.columnAtPoint(e.getPoint()));
                    sizeDialog.centerScreen();
               }
          }
          
          
          /**
           * Vrátí sloupec dle pozice myši.
           * Tato funkce je přímá kopie rodiče MouseInputHandler, kvůli její "privátnosti".
           * Potřebujeme ji v využití v overloadovaných funkcích
           * @param p  pozice myši
           * @return TableColumn sloupec
           */
          private TableColumn getResizingColumn(Point p, int column)
          {
          
               if (column == -1)
               {
                    return null;
               }
               
               Rectangle r = header.getHeaderRect(column);
               r.grow(-3, 0);
               
               if (r.contains(p))
               {
                    return null;
               }
               
               int midPoint = r.x + r.width / 2;
               int columnIndex;
               
               if (header.getComponentOrientation().isLeftToRight())
               {
                    columnIndex = (p.x < midPoint) ? column - 1 : column;
               }
               else
               {
                    columnIndex = (p.x < midPoint) ? column : column - 1;
               }
               
               if (columnIndex == -1)
               {
                    return null;
               }
               
               return header.getColumnModel().getColumn(columnIndex);
          }
          
          /**
           * myš je stisknutá - tlačítko dole
           * @param e událost myši
           */
          @Override public void mousePressed(MouseEvent e)
          {
               selectedCol = -1;
               super.mousePressed(e);
               
               if (header.columnAtPoint(e.getPoint()) != -1)   //klikli jsme na nějaký sloupec?
               {
                    //zjistíme, zda se nacházíme ve správné oblasti (tj. nejedná se o resize)
                    TableColumn resizingColumn = getResizingColumn(e.getPoint(), header.columnAtPoint(e.getPoint()));
                    
                    if (resizingColumn == null)
                    {
                         selectedCol = header.columnAtPoint(e.getPoint());
                    }
               }
          }
          
          /**
           * ukončeno táhnutí myši
           * @param e událost myši
           */
          @Override public void mouseDragged(MouseEvent e)
          {
               if (!header.isEnabled())
               {
                    return;
               }
               
               TableColumn resizingColumn  = header.getResizingColumn();
               JTable table = header.getTable();
               
               super.mouseDragged(e);
               
               if (resizingColumn == null)
               {
                    if (selectedCol != -1)   //označování
                    {
                         table.selectAll();
                         table.setColumnSelectionInterval(selectedCol, header.columnAtPoint(e.getPoint()));
                         header.repaint();
                    }
               }
               else
               {
               
                    TableModel model = table.getModel();
                    
                    if (model instanceof AttributiveCellTableModel)
                    {
                         CellAttribute cellAtt = ((AttributiveCellTableModel)model).getCellAttribute();
                         cellAtt.setWidth(resizingColumn.getModelIndex(), resizingColumn.getWidth(), cellAtt.SIZE_PIX);
                    }
               }
          }
          
          /**
           * uvolněné tlačítko
           * @param e událost myši
           */
          @Override public void mouseReleased(MouseEvent e)
          {
               if (!header.isEnabled())
               {
                    return;
               }
               
               super.mouseReleased(e);
               selectedCol = -1;
          }
     }
     
     /**
       * Budeme používat náš handler myši
       */
     @Override protected MouseInputListener createMouseInputListener()
     {
          return new MouseInputHandlerNew();
     }
     
}  // End of Class ColumnTableHeaderUI
